package com.lyq;

import com.hgq.JsonMd5;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.*;
import java.util.HashMap;
import java.util.HashSet;
/*
* 数据返回String
* 放回生成的文件路径，error和correct生成同一目录
* 返回null及失败
* */
/**
 * 一起生成程序，这样写节省空间
 * 传入参数
 * 1、查找的文件名
 * 2、正确文件夹名字
 * 3、错误文件夹名字
 * */
public class fileJsonPut  {
    String urls;
    String correctFilename,errorFileName;
    public  fileJsonPut(String urls,String correctFilename,String errorFileName){
        this.urls=urls;
        this.correctFilename=correctFilename;
        this.errorFileName=errorFileName;
    }
    public String JsonPut(){
        String url="";
        File file;
        JSONArray mainArray=new JSONArray();//正确文件
        JSONArray errorArray=new JSONArray();//错误文件
        try{ File tempFiles=new File(urls);
            url=tempFiles.getCanonicalPath();//获取当前相对地址+urls的地址
            System.out.println("文件地址获取成功!\n"+url);
        } catch (IOException e) {
            e.printStackTrace();
        }
        file=new File(url);
        if(!file.exists()){
            System.out.println(file.getPath()+"不存在");//判断文件夹内存不存在文件夹！
            return null;
        }
        File[] tempFile=file.listFiles();//存在文件夹就创建一个文件夹下的文件夹列表数组
        System.out.println("文件目录正常");
        for(int i=0;i<tempFile.length;i++){//当前在urls文件夹里面循环全部的文件夹
            if(!tempFile[i].isFile()) {//只要文件夹
//                System.out.println(tempFile[i].getPath());//开始进入到urls文件夹里的文件夹获取数据
                String fileAdreesName=tempFile[i].getPath();//url的获取
                putList(mainArray,errorArray,fileAdreesName);
            }
        }
        System.out.println("开始写入数据");
        jsonFileWrite correctfileWrite=new jsonFileWrite(mainArray,correctFilename);
        jsonFileWrite errorFIleWrite=new jsonFileWrite(errorArray,errorFileName);
        String adrees1,adrees2;
        adrees1=correctfileWrite.FileWrite();
        adrees2=errorFIleWrite.FileWrite();
            return "\n"+adrees1+"\n"+adrees2;
//        System.out.println("\n"+tempFiles.getPath()+"文件");
    }
    private void putList(JSONArray mainArray,JSONArray errorArray, String url){
        int flag=0;//检查两对数据是否已加入
        HashMap<String,String> jsonHashMap=new HashMap<>();
        HashMap<String,String> jarHashMap=new HashMap<>();
        JSONObject mainObject;
        HashSet<String> hashSet=new HashSet<String>();
        File file=new File(url);
        File[]fileList=file.listFiles();
        if(!file.exists()){
            System.out.println(file.getPath()+"文件夹不存在");
            return ;
        }else {//判断这个文件夹是否为空
            //获得文件的名字；
            for(File fileNameget:fileList){
                if(fileNameget.isFile()){//是文件
                    String name=fileNameget.getName();
                    int lastIndexName=name.lastIndexOf(".");
//                    System.out.println(lastIndexName);
                    if(lastIndexName==-1){//不是.xxx文件直接加入到error文件中！
                        JSONObject jNew=new JSONObject();
                        jNew.put("errorURL",fileNameget.getPath());
                        jNew.put("errormsg","文件类型错误:未知文件");
                        errorArray.put(jNew);
                    }else {
                        String lastName = name.substring(name.lastIndexOf(".") + 1);//获取文件的最后的标识
                        String headName = name.substring(0, name.lastIndexOf("."));
                        if (!hashSet.contains(headName)) {
                            hashSet.add(headName);

                        } else {
                            if(lastName.equalsIgnoreCase("json") || lastName.equalsIgnoreCase("jar")) {//只删去后缀为json和jar的文件
                                hashSet.remove(headName);//当重复了就删去重复的键值
                            }
                        }
//                        System.out.println(headName);
                    }
                }
            }//-------------------------------------------判断没有重复值的数据--=------------------------------------
//            for(String h:hashSet){
//                System.out.println("重复文件："+h);
//            }
            //--------------------------------------------判断文件是否重复后分配数据------------------------------------------------
            flag=2;
            for(File fileListName:fileList) {
                if (fileListName.isFile()) {//==========================只检查文件======================
                    String name = fileListName.getName();
                    int lastIndexName = name.lastIndexOf(".");
                    if (!(lastIndexName == -1)) {//=====================只查询有后缀的文件===========
                        String lastName = name.substring(lastIndexName + 1);//获取文件的后缀
                        String headName = name.substring(0, lastIndexName);//获取文件名
                        String path = fileListName.getPath();

                        if (hashSet.contains(headName)) {//=========存在这个数说明不是重复的就是error========
                            if(lastName.equalsIgnoreCase("json")||lastName.equalsIgnoreCase("jar")){
//                                System.out.println("error文件：" + name);
                                JSONObject jNew = new JSONObject();
                                jNew.put("errorURL", path);
                                jNew.put("errormsg",  "未找到匹配文件: ."+lastName);
                                errorArray.put(jNew);
                            }else{
//                                System.out.println("error文件：" + name);
                                JSONObject jNew = new JSONObject();
                                jNew.put("errorURL", path);
                                jNew.put("errormsg","此文件类型错误:."+lastName);
                                errorArray.put(jNew);
                            }
                        } else if (lastName.equalsIgnoreCase("json") || lastName.equalsIgnoreCase("jar")) {//是json和jar格式的文件
                            if (lastName.equalsIgnoreCase("json")) {//只获取json结尾的文件！
//                        System.out.println(fileListName.getName() + "\n" + fileListName.getPath());
                                jsonHashMap.put("serviceJsonRoot", path);
                                jsonHashMap.put("serviceJson", name);
//                                System.out.println("加入的数据json:" + name);
                                flag += 1;
//                        这里可以插入文件内的数据有需要在说
                            } else if (lastName.equalsIgnoreCase("jar")) {
                                jarHashMap.put("serviceJarRoot", path);
                                jarHashMap.put("serviceJar", name);
//                                System.out.println("加入的数据jar:" + name);
                                flag += 1;
                            }
//                            System.out.println("flag的值： " + flag + "\n除余" + flag % 2);
                            if (flag % 2 == 0) {
//                                System.out.println("\n找到匹配的一对数据\n");
                                String serviceJarRoot=jarHashMap.get("serviceJarRoot");
                                String serviceJsonRoot=jsonHashMap.get("serviceJsonRoot");
                                String previous = url;//文件夹名字
                                mainObject = new JSONObject();//=================新建内存单元==============
                                mainObject.put("serviceJsonRoot",serviceJsonRoot );
                                mainObject.put("serviceJson", jsonHashMap.get("serviceJson"));
                                mainObject.put("serviceJarRoot",serviceJarRoot );
                                mainObject.put("serviceJar", jarHashMap.get("serviceJar"));
                                mainObject.put("serviceURL", previous);
                                mainObject.put("serviceJarMD5", JsonMd5.getJsonMD5(serviceJarRoot));
                                mainObject.put("serviceJsonMD5",JsonMd5.getJsonMD5(serviceJsonRoot));
                                mainArray.put(mainObject);
//                                System.out.println("文件夹： " + previous + name + " 内的文件名读取成功");
                            }
                        }
                    }
                }
            }
//            System.out.println("数据写入完成");//-----------------------------------------------for结束-----------------------------------------
        }
    }
    /*error.json构成
[
{
"errorURl"：“xxxxxx”
"errormsg":"文件缺失或者错误原因"
}
]

主清单构成:
[
{
"serviceURL"：“xxxxxx”,
"serviceJar":"xxx.jar"
"serviceJarRoot":"xxxxxxx",
"serviceJson":"",
"serviceJsonRoot":"xxxxxxxxx"
}
]
*/
}